package com.cg.leetcode;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 131.分割回文串
 *
 * @author cg
 * @program LeetCode->LeetCode_131
 * @create 2022-08-27 20:31
 **/
public class LeetCode_131 {

    @Test
    public void test131() {
        System.out.println(partition("aab"));
    }

    /**
     * 给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是 回文串 。返回 s 所有可能的分割方案。
     * 回文串 是正着读和反着读都一样的字符串。
     * <p>
     * 示例 1：
     * 输入：s = "aab"
     * 输出：[["a","a","b"],["aa","b"]]
     * <p>
     * 示例 2：
     * 输入：s = "a"
     * 输出：[["a"]]
     * <p>
     * 提示：
     * 1 <= s.length <= 16
     * s 仅由小写英文字母组成
     *
     * @param s
     * @return
     */
    public List<List<String>> partition(String s) {
        result = new ArrayList<>();
        path = new ArrayList<>();

        helper(s, 0);
        return result;
    }

    List<List<String>> result;
    List<String> path;

    private void helper(String s, int startIndex) {
        // 如果起始位置已经大于s的大小，说明已经找到了一组分割方案了
        if (startIndex >= s.length()) {
            result.add(new ArrayList<>(path));
            return;
        }
        for (int i = startIndex; i < s.length(); i++) {
            // 判断是不是回文串
            if (isPalindrome(s, startIndex, i)) {
                // 获取[startIndex,i]在s中的子串
                String sub = s.substring(startIndex, i + 1);
                path.add(sub);
            } else {
                continue;
            }
            // 寻找i+1为起始位置的子串
            helper(s, i + 1);
            path.remove(path.size() - 1);
        }
    }

    private boolean isPalindrome(String s, int i, int j) {
        while (i < j) {
            if (s.charAt(i) != s.charAt(j)) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }

}
